package cloud.xiangyixiang.www.spring.boot.java.basics.utils;

import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.FileImageOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * <p>
 * Image2TextUtil
 * </p>
 *
 * @author weixin
 * @date 2023/9/4 18:24
 */
public class Image2TextUtil {

    /**
     * 图片到byte数组
     * @param path {@link String} 图片地址
     * @return  byte[]
     */
    public static byte[] image2byte(String path) {
        byte[] data = null;
        try {
            try (FileImageInputStream input = new FileImageInputStream(new File(path))) {
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] buf = new byte[1024];
                int numBytesRead = 0;
                while ((numBytesRead = input.read(buf)) != -1) {
                    output.write(buf, 0, numBytesRead);
                }
                data = output.toByteArray();
                output.close();
            }
        } catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }

    /**
     * byte数组到图片
     * @param data {@link byte[]}
     * @param path {@link String}
     */
    public static void byte2image(byte[] data, String path) {
        if (data.length < 3 || "".equals(path))
            return;
        try {
            try (FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path))) {
                imageOutput.write(data, 0, data.length);
            }
            System.out.println("Make Picture success,Please find image in " + path);
        } catch (Exception ex) {
            System.out.println("Exception: " + ex);
            ex.printStackTrace();
        }
    }

    /**
     * byte数组到16进制字符串
     * @param data {@link byte[]}
     * @return String
     */
    public String byte2string(byte[] data) {
        if (data == null || data.length <= 1)
            return "0x";
        if (data.length > 200000)
            return "0x";
        StringBuffer stringBuffer = new StringBuffer();
        int[] buf = new int[data.length];
        // byte数组转化成十进制
        for (int k = 0; k < data.length; k++) {
            buf[k] = data[k] < 0 ? (data[k] + 256) : (data[k]);
        }
        // 十进制转化成十六进制
        for (int i : buf) {
            if (i < 16)
                stringBuffer.append("0").append(Integer.toHexString(i));
            else {
                stringBuffer.append(Integer.toHexString(i));
            }
        }
        return "0x" + stringBuffer.toString().toUpperCase();
    }

}
